/**
 * 远光ECP平台3.0版本 http://www.ygsoft.com/ Grace [Gris Application Cloud-Computing
 * Extension]
 * Copyright(c) 1998 - 2020 YGSoft.Inc, All Rights Reserved
 * 
 * ecp.component.webUpload.js
 * 
 * 对百度上传控件封装
 * 
 * 变更版本：
 * Created by zhengxianwei@ygsoft.com 2016-05-13
 */
define(["jquery", "ecp.utils", "webuploader", "ecp.utils.i18n"],function($, utils, $webUploader, i18n){
	/**
	 * 默认参数.
	 */
	var defaultOption = {
		//指定选择文件的按钮容器，不指定则不创建按钮
		pick: {
			//指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
		    innerHTML: i18n.upload.addAttatch,
		    //是否开起同时选择多个文件能力
		    multiple:true 
		},
		//指定接受哪些类型的文件。 由于目前还有ext转mimeType表，所以这里需要分开指定。
//		accept: {  
//			//文字描述
//			title: 'Images',  
//			//允许的文件后缀，不带点，多个用逗号分割。
//			extensions: 'gif,jpg,jpeg,bmp,png,pdf,txt,doc,docx,xls,xlsx,ppt,pptx,pub,XSM,rar,zip',
//			//多个用逗号分割。
//			mimeTypes: 'file/*'
//		},
		//指定Drag And Drop拖拽的容器，如果不指定，则不启动
		dnd: '',
		//是否禁掉整个页面的拖拽功能，如果不禁用，图片拖进来的时候会默认被浏览器打开。
//		disableGlobalDnd: false,
		//指定监听paste事件的容器，如果不指定，不启用此功能。此功能为通过粘贴来添加截屏的图片。
//		paste: document.body,
		//配置生成缩略图的选项。
		thumb:null,
		//配置压缩的图片的选项。如果此选项为false, 则图片在上传前不进行压缩。
		compress:null,
		//设置为 true 后，不需要手动调用上传，有文件选择即开始上传
//		auto:false,
		swf: '/grm/ecp/webcore/plugins/webuploader/Uploader.swf',
		//是否要分片处理大文件上传。
		chunked: true,
		//如果要分片，分多大一片？ 默认大小为5M(5242880).
//		chunkSize:5242880,
		//如果某个分片由于网络问题出错，允许自动重传多少次？默认两次
//		chunkRetry:2,
		//上传并发数。允许同时最大上传进程数。默认3
//		threads:3,
		//设置文件上传域的name。
//		fileVal:'file',
		//文件上传方式，POST或者GET。
		method:'POST',
		//指定运行时启动顺序。默认会想尝试 html5 是否支持，如果支持则使用 html5, 否则则使用 flash.可以将此值设置成 flash，来强制使用 flash 运行时。
//		runtimeOrder: 'flash',
		//是否允许在文件传输时提前把下一个文件准备好。 对于一个文件的准备工作比较耗时，比如图片压缩，md5序列化。 如果能提前在当前文件传输期处理，可以节省总体耗时。
		prepareNextFile:false,
		//是否已二进制的流的方式发送文件，这样整个上传内容php://input都为文件内容， 其他参数在$_GET数组中。
		sendAsBinary: false,
//		server: '/grm/ecp/webcore/FileAccessServlet?beanId=com.ygsoft.ecp.web.service.context.IFileAccessContext&method=saveFile&operParams=[]&_token=' + $.cookie("ecpDataContext.tokenId") + "&tParam=" + new Date().getTime(),
		//去重， 根据文件名字、文件大小和最后修改时间来生成hash Key
		duplicate: undefined,
		//验证文件总数量, 超出则不允许加入队列。
		fileNumLimit: 300,
		//验证文件总大小是否超出限制, 超出则不允许加入队列。
		fileSizeLimit: 50 * 1024 * 1024,    // 50 M
		//验证单个文件大小是否超出限制, 超出则不允许加入队列。
		fileSingleSizeLimit: 20 * 1024 * 1024    // 20 M
	};
	
	/**
	 * 声明WebUpload对象.
	 * @param {Object} control 占位符
	 * @param {Object} option 控件渲染配置属性
	 */
	var WebUpload = function(control,option){
		if(!control || control.length === 0){return;}
		this.init(control,option);
		this.render();
	}
	
	/**
	 * 通过原型定义相关方法，比如渲染、赋值等等.
	 */
	WebUpload.prototype = {
		/**
		 * 初始化.
		 * @param {Object} control 占位符
		 * @param {Object} option 控件渲染配置属性
		 */
		init: function(control,option){
			this.control = control;
			this.option = $.extend(true, {}, defaultOption, option);
			var cId = control.attr("id");
			if(!cId){
				cId = Math.uuid();
				control.attr("id",cId);
			}
			this.option.pick.id = "#" + cId;
			var contianer = option.contianer;
			if(!contianer || contianer.length === 0){
				contianer = $("body");
			}
			this.contianer = contianer;
		},
		
		/**
		 * 渲染原生百度上传控件.
		 */
		render: function(){
			var me = this,
				uploader;
			uploader = new $webUploader.Uploader(me.option);
			me.control[0].uploader = me.uploader = uploader;
			//绑定事件
			me.bindEvent();
		},
		
		/**
		 * 绑定事件.
		 */
		bindEvent: function(){
			var me = this,
				uploader = me.uploader,
				opt = me.option;
			// 文件上传成功。
		    uploader.on( 'uploadSuccess', function( file ) {
		    	opt.uploadSuccess && opt.uploadSuccess.call(me, file, opt);
		    });
		    
		    // 文件上传失败，现实上传出错。
		    uploader.on( 'uploadError', function( file ) {
		    	opt.uploadError && opt.uploadError.call(me, file, opt);
		    });
		 // 文件上传失败，现实上传出错。
		    uploader.on( 'error', function( file ) {
		    	opt.uploadError && opt.uploadError.call(me, file, opt);
		    });
		    //文件上传之前
		    uploader.on( 'beforeFileQueued', function( file ) {
		    	opt.beforeFileQueued && opt.beforeFileQueued.call(me, file, opt);
		    });
		    
		    // 当有文件添加进来的时候（批量处理文件）
		    uploader.on( 'filesQueued', function( files ) {
		    	opt.filesQueued && opt.filesQueued.call(me, files, opt);
		    });
		},
		/**
		 * 获得上传组件实例.
		 */
		getUploader: function(){
			return this.uploader;
		}
	};
	
	(function($) {
		var old = $.fn.webUpload;
		$.fn.webUpload = function(option){
			var me = this;
			option = option || {};
			var type = typeof(option);
			//如果第一个参数传入的是对象或空则初始化空件，如果传入的是字符串，则认为是调用里面的内部方法。
			if (type === "object") {
				var eus = [];
				this.each(function() {
					var instanceOption = $.extend({}, option, true);
					var instance = new WebUpload($(this), instanceOption);
					this.webUpload = instance;
					eus.push(instance);
				});
				if(eus.length === 1){
					eus = eus[0];
				}
				return eus;
			} else if (type === "string") {
				var args = Array.prototype.slice.call(arguments, 1);
				if (WebUpload.prototype[option]) {
					return WebUpload.prototype[option].call(args);
				}
			} else if (option === true) {
				return me[0] && me[0].webUpload;
			}
		};
		$.fn.webUpload.Constructor = WebUpload;
		$.fn.webUpload.noConflict = function() {
			$.fn.webUpload = old;
			return this;
		};
	}(jQuery));
	return WebUpload.prototype;
		
});